package com.bdan.t382.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class TimeSpanAspect {
     private static final Logger log = LoggerFactory.getLogger(
             TimeSpanAspect.class);
 /**
  * 环绕增强
  */
      public Object around(ProceedingJoinPoint jp) throws Throwable {
      log.info("【环绕增强-前置】记录{}方法执行的开始时间.",
            jp.getSignature().getName());
       // 进入方法之前就记录开始时间
       long startTime = System.currentTimeMillis();
       try {
        // 通过 proceed()方法可以执行目标方法
        Object result = jp.proceed();
        log.info("【环绕增强-后置】{}方法执行结果为{}." ,
            jp.getSignature().getName() , result);
        // 注意：环绕增强要将结果返回
        return result;
        } catch (Throwable e) {
        log.info("【环绕增强-异常抛出】{}方法执行异常信息为{}." ,
            jp.getSignature().getName() , e.getMessage());
        // 注意：不能隐瞒异常，需要抛出
        throw e;
        } finally {
        // 在 finally 中记录结束时间，保证不管正常还是异常都能记录执行时间
        long endTime = System.currentTimeMillis();
        log.info("【环绕增强-最终】记录{}方法执行的结束时间，并计算耗时为{}ms.",
            jp.getSignature().getName() , (endTime - startTime));
        }
       }
}
